package com.apchernykh.rozhlasapp.player.fallback;



import com.apchernykh.rozhlasapp.utils.ConditionalLog;

import android.content.Context;

public final class RozhlasFallbackPlayerMP3 extends RozhlasFallbackPlayer {

	public RozhlasFallbackPlayerMP3(Context iContext, String iStreamUri) {
		super(iContext, iStreamUri);
	}

	// See MP3 standard. 12-bit marker is on each frame start
	boolean tryRecognizeFrame(byte[] iBuffer, int iOffset) {
		if (iBuffer[iOffset] == (byte) 0xff) {
			ConditionalLog.d("Searching for an MP3 frame "
					+ iBuffer[iOffset + 1]);
			if ((iBuffer[iOffset + 1] & (byte) 0xE0) == (byte) 0xE0) {
				int versionId = (iBuffer[iOffset + 1] & (byte) 0x18) >> 3;
				int layerDescr = (iBuffer[iOffset + 1] & (byte) 0x06) >> 1;
				int bitRate = ((iBuffer[iOffset + 2] & (int) 0x00F0) >> 4);
				int samplingRate = ((iBuffer[iOffset + 2] & (byte) 0x0C) >> 2);
				ConditionalLog.d("Found frame versionId = "
						+ versionId + " layerDescr = " + layerDescr + " bitRateId = " + bitRate + " samplingRate = " + samplingRate);
				
				return true;
			}
		}
		return false;
	}


	//http://www.mpgedit.org/mpgedit/mpeg_format/mpeghdr.htm
	
//	AAAAAAAA AAABBCCD EEEEFFGH IIJJKLMM
//
//	Sign	Length
//	(bits)	Position
//	(bits)	Description
//	A	11	(31-21)	Frame sync (all bits set)
//	B	2	(20,19)	MPEG Audio version ID
//	00 - MPEG Version 2.5
//	01 - reserved
//	10 - MPEG Version 2 (ISO/IEC 13818-3)
//	11 - MPEG Version 1 (ISO/IEC 11172-3)
//
//	Note: MPEG Version 2.5 is not official standard. Bit No 20 in frame header is used to indicate version 2.5. Applications that do not support this MPEG version expect this bit always to be set, meaning that frame sync (A) is twelve bits long, not eleve as stated here. Accordingly, B is one bit long (represents only bit No 19). I recommend using methodology presented here, since this allows you to distinguish all three versions and keep full compatibility.
//	C	2	(18,17) 	Layer description
//	00 - reserved
//	01 - Layer III
//	10 - Layer II
//	11 - Layer I
//	D	1	(16) 	Protection bit
//	0 - Protected by CRC (16bit crc follows header)
//	1 - Not protected
//	E	4	(15,12)	Bitrate index
//	bits	V1,L1	V1,L2	V1,L3	V2,L1	V2, L2 & L3
//	0000	free	free	free	free	free
//	0001	32	32	32	32	8
//	0010	64	48	40	48	16
//	0011	96	56	48	56	24
//	0100	128	64	56	64	32
//	0101	160	80	64	80	40
//	0110	192	96	80	96	48
//	0111	224	112	96	112	56
//	1000	256	128	112	128	64
//	1001	288	160	128	144	80
//	1010	320	192	160	160	96
//	1011	352	224	192	176	112
//	1100	384	256	224	192	128
//	1101	416	320	256	224	144
//	1110	448	384	320	256	160
//	1111	bad	bad	bad	bad	bad
//
//	NOTES: All values are in kbps
//	V1 - MPEG Version 1
//	V2 - MPEG Version 2 and Version 2.5
//	L1 - Layer I
//	L2 - Layer II
//	L3 - Layer III
//	"free" means free format. If the correct fixed bitrate (such files cannot use variable bitrate) is different than those presented in upper table it must be determined by the application. This may be implemented only for internal purposes since third party applications have no means to find out correct bitrate. Howewer, this is not impossible to do but demands lot's of efforts.
//	"bad" means that this is not an allowed value
//
//	MPEG files may have variable bitrate (VBR). This means that bitrate in the file may change. I have learned about two used methods:
//	bitrate switching. Each frame may be created with different bitrate. It may be used in all layers. Layer III decoders must support this method. Layer I & II decoders may support it.
//	bit reservoir. Bitrate may be borrowed (within limits) from previous frames in order to provide more bits to demanding parts of the input signal. This causes, however, that the frames are no longer independent, which means you should not cut this files. This is supported only in Layer III.
//
//	More about VBR you may find on Xing Tech site
//
//	For Layer II there are some combinations of bitrate and mode which are not allowed. Here is a list of allowed combinations.
//	bitrate 	allowed modes
//	free 	all
//	32 	single channel
//	48 	single channel
//	56 	single channel
//	64 	all
//	80 	single channel
//	96 	all
//	112 	all
//	128 	all
//	160 	all
//	192 	all
//	224 	stereo, intensity stereo, dual channel
//	256 	stereo, intensity stereo, dual channel
//	320 	stereo, intensity stereo, dual channel
//	384 	stereo, intensity stereo, dual channel
//	F	2	(11,10) 	Sampling rate frequency index (values are in Hz)
//	bits	MPEG1	MPEG2	MPEG2.5
//	00	44100	22050	11025
//	01	48000	24000	12000
//	10	32000	16000	8000
//	11	reserv.	reserv.	reserv.
//	G	1	(9) 	Padding bit
//	0 - frame is not padded
//	1 - frame is padded with one extra slot
//	Padding is used to fit the bit rates exactly. For an example: 128k 44.1kHz layer II uses a lot of 418 bytes and some of 417 bytes long frames to get the exact 128k bitrate. For Layer I slot is 32 bits long, for Layer II and Layer III slot is 8 bits long.
//
//	How to calculate frame length
//
//	First, let's distinguish two terms frame size and frame length. Frame size is the number of samples contained in a frame. It is constant and always 384 samples for Layer I and 1152 samples for Layer II and Layer III. Frame length is length of a frame when compressed. It is calculated in slots. One slot is 4 bytes long for Layer I, and one byte long for Layer II and Layer III. When you are reading MPEG file you must calculate this to be able to find each consecutive frame. Remember, frame length may change from frame to frame due to padding or bitrate switching.
//
//	Read the BitRate, SampleRate and Padding of the frame header.
//
//	For Layer I files us this formula:
//
//	FrameLengthInBytes = (12 * BitRate / SampleRate + Padding) * 4
//
//	For Layer II & III files use this formula:
//
//	FrameLengthInBytes = 144 * BitRate / SampleRate + Padding
//
//	Example:
//	Layer III, BitRate=128000, SampleRate=441000, Padding=0
//	      ==>  FrameSize=417 bytes
//	H	1	(8) 	Private bit. It may be freely used for specific needs of an application, i.e. if it has to trigger some application specific events.
//	I	2	(7,6) 	Channel Mode
//	00 - Stereo
//	01 - Joint stereo (Stereo)
//	10 - Dual channel (Stereo)
//	11 - Single channel (Mono)
//	J	2	(5,4) 	Mode extension (Only if Joint stereo)
//
//	Mode extension is used to join informations that are of no use for stereo effect, thus reducing needed resources. These bits are dynamically determined by an encoder in Joint stereo mode.
//
//	Complete frequency range of MPEG file is divided in subbands There are 32 subbands. For Layer I & II these two bits determine frequency range (bands) where intensity stereo is applied. For Layer III these two bits determine which type of joint stereo is used (intensity stereo or m/s stereo). Frequency range is determined within decompression algorythm.
//	Layer I and II	Layer III
//	value	Layer I & II
//	00	bands 4 to 31
//	01	bands 8 to 31
//	10	bands 12 to 31
//	11	bands 16 to 31
//		
//	Intensity stereo	MS stereo
//	off	off
//	on	off
//	off	on
//	on	on
//	K	1	(3) 	Copyright
//	0 - Audio is not copyrighted
//	1 - Audio is copyrighted
//	L	1	(2) 	Original
//	0 - Copy of original media
//	1 - Original media
//	M	2	(1,0) 	Emphasis
//	00 - none
//	01 - 50/15 ms
//	10 - reserved
//	11 - CCIT J.17
	
}
